package com.eva.core.utils;

import com.alibaba.fastjson.JSON;
import com.eva.core.model.ApiResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * 安全处理工具类
 * @author Eva.Caesar Liu
 * @date 2022/02/19 18:03
 */
@Slf4j
@Component
public class Secure {

    @Value("${swagger.enabled}")
    private Boolean enableSwagger;

    @Value("${swagger.enable-encrypt}")
    private Boolean enableSwaggerEncrypt;

    /**
     * 是否不需要接口加解密操作
     * @param request 请求参数
     * @return
     */
    public boolean disallowEncrypt(HttpServletRequest request) {
        // 上传文件
        if (request.getContentType() != null && request.getContentType().contains("multipart/form-data")) {
            return Boolean.TRUE;
        }
        // Swagger请求
        String requestOrigion = request.getHeader("Request-Origion");
        if("SwaggerBootstrapUi".equals(requestOrigion)) {
            if (!this.enableSwagger || !this.enableSwaggerEncrypt) {
                return Boolean.TRUE;
            }
        }
        return Boolean.FALSE;
    }

    /**
     * 解密请求参数
     * @param request 请求参数
     * @return
     */
    public String decryptRequest(String request) {
        return Utils.AES.decrypt(request);
    }

    /**
     * 加密响应内容
     * @param response 响应内容
     * @return
     */
    public String encryptResponse (String response) {
        return Utils.AES.encrypt(response);
    }

    /**
     * 解密响应内容
     * @param response
     * @return
     */
    public ApiResponse decryptResponse (String response) {
        String responseBody = Utils.AES.decrypt(response);
        return JSON.parseObject(responseBody, ApiResponse.class);
    }

    /**
     * 加密密码
     * @param password 密码
     * @param salt 密码盐
     *
     * @return String
     */
    public String encryptPassword(String password, String salt) {
        return this.encryptMD5Password(DigestUtils.md5DigestAsHex(password.getBytes()), salt);
    }

    /**
     * 加密密码
     * @param md5Password 密码
     * @param salt 密码盐
     *
     * @return String
     */
    public String encryptMD5Password(String  md5Password, String salt) {
        return DigestUtils.md5DigestAsHex((md5Password + salt).getBytes());
    }
}
